﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using ClassLibraryEntidades;
using System.Windows.Forms;
using ClassLibraryServer.Negocio;
using System.Xml.Serialization;

namespace SerializaRutasSimuladas
{
    public class ControlRutas
    {
        #region Atributos y Propiedades

        public Dictionary<string, Ruta> dictionaryBusquedas = null;

        private Nodo ultimoNodo = null;

        private List<Arco> lista_arcos_temporal = null;

        public string path_fichero_searchers = Application.StartupPath + @"\searches.data"; //por defecto se toma esta

        #endregion

        #region Contructor Singleton
        private static ControlRutas instance=null;
        public static ControlRutas Instance
        {
            get
            {
                if (instance == null)
                    instance = new ControlRutas();
                return instance;
            }
            
        }

        
        private ControlRutas()
        {
            lista_arcos_temporal = new List<Arco>(20);
        }

        #endregion

        #region Metodos generacion de fichero


        public Dictionary<string, Ruta> Cargar_fichero_busquedas(string path_fichero)
        {
            if (File.Exists(path_fichero))
            {
                //----------------------------------------------
                //USANDO FICHERO BINARIO
                //----------------------------------------------
                //this.path_fichero_searchers = path_fichero;

                //// Create file to save the data to
                //FileStream fs = new FileStream(path_fichero_searchers, FileMode.Open);
                //// Create a BinaryFormatter object to perform the serialization
                //BinaryFormatter bf = new BinaryFormatter();
                //dictionaryBusquedas = (Dictionary<string, Ruta>)bf.Deserialize(fs);
                //fs.Close();

                //return dictionaryBusquedas;

                //-----------------------------------
                //USANDO XML
                //-----------------------------------
                this.dictionaryBusquedas=Util.ObtenerRutasDesdeArchivo(path_fichero);
                return this.dictionaryBusquedas;


            }
            else
                throw new Exception("Fichero de busquedas no existe");

        }

        public string GuardarFicherbusquedas()
        {
            //----------------------------------------------
            //USANDO FICHERO BINARIO
            //----------------------------------------------

            ////--------------Guardamos el fichero de busquedas con la nueva ruta-----------------------
            //// Create file to save the data to
            //FileStream fs2 = new FileStream(path_fichero_searchers, FileMode.Create);
            //// Create a BinaryFormatter object to perform the serialization
            //BinaryFormatter bf2 = new BinaryFormatter();
            //// Use the BinaryFormatter object to serialize the data to the file
            //bf2.Serialize(fs2, dictionaryBusquedas);
            //// Close the file
            //fs2.Close();

            //return this.path_fichero_searchers;

            //-----------------------------------
            //USANDO XML
            //-----------------------------------
            Util.GuardaRutasEnArchivo(path_fichero_searchers, dictionaryBusquedas);
            return this.path_fichero_searchers;
            
        }

        
        #endregion

        #region Metodos para gestion de NODOS,arcos....


        public void AddArco(string calle, int numero, int coorX, int coorY, Transporte transporte)
        {
            Coordenada coordenada=new Coordenada(coorX,coorY);
            Direccion direccion=new Direccion(calle,numero);

            if (ultimoNodo == null) //Es el primero nodo
            {
                ultimoNodo = new Nodo(coordenada, direccion);
            }
            else
            {
                Nodo nuevoNodo = new Nodo(coordenada, direccion);
                Arco arcoTemp = new Arco(ultimoNodo, nuevoNodo);
                arcoTemp.transporte = transporte;
                lista_arcos_temporal.Add(arcoTemp);
                ultimoNodo = nuevoNodo;
            }

        }

        public void GuardarRutaActual(string tipoRuta)
        {
            Ruta ruta = new Ruta(tipoRuta,lista_arcos_temporal);

            //----------------Añadimos a nuestro HASH la nueva ruta-------------------------------
            string key_busqueda = tipoRuta;
            int num_arcos = ruta.arcos.Count;
            Nodo nodoInicio = ruta.arcos[0].origen;
            Nodo nodoDestino = ruta.arcos[num_arcos - 1].destino;

            //string calle_origen = Util.FormatearCalleQuitandoAcentos(nodoInicio.direccion.calle);
            //string calle_destino = Util.FormatearCalleQuitandoAcentos(nodoDestino.direccion.calle);
            string calle_origen = nodoInicio.direccion.calle;
            string calle_destino = nodoDestino.direccion.calle;

            key_busqueda += Util.FormatearCalleQuitandoAcentos(calle_origen)  + nodoInicio.direccion.numero.ToString() +
                            Util.FormatearCalleQuitandoAcentos(calle_destino) + nodoDestino.direccion.numero.ToString();

            if (dictionaryBusquedas == null)
                dictionaryBusquedas = new Dictionary<string, Ruta>();
            dictionaryBusquedas.Add(key_busqueda, ruta);

            //----------------------------------------------------------------------------------
            //borramos la lista de arcos para comenzar con otra nueva ruta
            lista_arcos_temporal.Clear();
            ultimoNodo = null;
            
        }
        #endregion



    }
}
